package fr.controleur;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import fr.bdd.BddVirtuelle;

//import fr.beans.User;

//import org.eclipse.jdt.internal.compiler.batch.Main;
//import org.apache.log4j;


public class ServletControleur extends HttpServlet {

  /* ************************************* properties */
  
  //private static org.apache.log4j.Logger LOG = Logger.getLogger(Main.class);
  //private static org.apache.log4j.Logger LOG = Logger.getLogger(ServletControleur.class);
  private static Logger LOG = Logger.getLogger("MyLogger");
  
  /* ************************************* contructors */
  
  /**
   * 
   */
  private static final long serialVersionUID = 7349440777117010588L;
  
  
  @Override
  /**
   * doGet() est appel�e lorsque la requ�te est pass�e en mode GET
   */
  public void doGet( HttpServletRequest req, HttpServletResponse rep) throws IOException, ServletException {
    processRequest(req, rep);
  }
  
  
  @Override
  /**
   * doPost() est appel�e lorsque la requ�te est pass�e en mode POST
   */
  public void doPost( HttpServletRequest req, HttpServletResponse rep) throws IOException, ServletException {
    processRequest(req, rep);
  }
  
  
  /**
   * @param req
   * @param rep
   * @throws IOException
   * @throws ServletException
   */
  public void processRequest( HttpServletRequest req, HttpServletResponse rep) throws IOException, ServletException {
    
    // Construire la BDD
    BddVirtuelle.build();
    
    // init le content type
    rep.setContentType("text/html;charset=UTF-8");
    
    // permet de recuperer par exemple "/seloguer" (avec substring le slash du debut est supprime)
    String current_path = req.getPathInfo().toString().substring(1);
    
    // Recuperer la liste des actions possibles
    ReglesActions.build();
    ArrayList<String> listActions = ReglesActions.getListActions();
    
    //System.out.println("current_path : " + current_path);
    LOG.log(Level.FINE, "current_path : " + current_path);
    
    
    RequestDispatcher rd = null;
    
    if (listActions.contains(current_path)) {
      // ACTION POSSIBLE
      System.out.println("ok1");
      
      // include du header
      rd = getServletContext().getRequestDispatcher("/_inc/header.html");
      rd.include(req, rep);
      
      // Vérifier dans un switch dans quel cas nous sommes
      switch (current_path) {
        // page se loguer
        case "seloguer":
          rd = getServletContext().getRequestDispatcher("/www/formlogin.html");
          rd.include(req, rep);
          
          break;
        
        // page pour s'identifier
        case "sidentifier":
          
          // Passer par UserAction pour savoir si le user existe avec ce login + password
          UserAction ua = new UserAction();
          String retour = ua.seloguer(req);
          
          if (retour == "SUCCESS") {
            // CONNEXION REUSSI
            rd = getServletContext().getRequestDispatcher("/www/successlogin.html");
            //rd.toString().concat("SDFDFGDFGHFGHFGJGHJ");
            rd.include(req, rep);
            
            //rd = getServletContext().getRequestDispatcher("/www/test.jsp");
            //req.setAttribute("msg", "hello world!");
            //rd.forward(req, rep);
            
            // TODO test
            //PrintWriter out = rep.getWriter();
            //out.println("<h2>Nombre de user connecte</h2>");
            //out.println(UserAction.getUserSessionCount());
            System.out.println("UserAction.getUserSessionCount() : " + UserAction.getUserSessionCount());
            
          } else {
            // CONNEXION EN ECHEC
            
            // Enregistrer l'echec dans les logs
            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date();
            LOG.log(Level.WARNING, dateFormat.format(date) + " Echec de la connexion (ip : " + req.getRemoteAddr() + ")");
            
            // Afficher la page d'erreur de connexion
            rd = getServletContext().getRequestDispatcher("/www/errorlogin.html");
            rd.include(req, rep);
          }
          
          break;
        
        // page se deconnecter
        case "sedeconnecter":
          
          // Détruire les sessions
          HttpSession session = req.getSession();
          session.invalidate();
          
          // Afficher la page indiquant qu'il y a eu déconnexion
          rd = getServletContext().getRequestDispatcher("/www/disconnect.html");
          rd.include(req, rep);
          
          break;
        
        default:
          rd = getServletContext().getRequestDispatcher("/www/actioninconnu.html");
          rd.include(req, rep);
      }
      
      // include du footer
      rd = getServletContext().getRequestDispatcher("/_inc/footer.html");
      rd.include(req, rep);
    } else {
      // ACTION PAS POSSIBLE
      
      System.out.println("ok2b");
      
      rd = getServletContext().getRequestDispatcher("/_inc/header.html");
      // TODO essayer de trouver une méthode pour changer dynamiquement des infos sur la page !
      //String template = rd.toString();
      //rd.toString().replaceAll("{{TITLE}}", "coucou le titre");
      rd.include(req, rep);
      rd = getServletContext().getRequestDispatcher("/www/actioninconnu.html");
      rd.include(req, rep);
      rd = getServletContext().getRequestDispatcher("/_inc/footer.html");
      rd.include(req, rep);
      
      
    }
    
    
  }
  
  
  /* ************************************* methods m�tiers */
  
  
  /* ************************************* methods aspects */
  
  
  /* ************************************* accesseurs (get) */
  
  /* ************************************* mutateurs (set) */
  
}
